"""
Toast 组件，用于显示临时提示信息
"""
from PyQt5.QtWidgets import QLabel, QWidget, QVBoxLayout, QApplication
from PyQt5.QtCore import Qt, QTimer, QPropertyAnimation, QEasingCurve, QRect, QPoint
from PyQt5.QtGui import QColor, QPalette


class Toast(QLabel):
    """
    Toast 组件，用于显示临时提示信息
    """
    
    # 定义不同类型的 Toast 样式
    INFO = "info"
    SUCCESS = "success"
    WARNING = "warning"
    ERROR = "error"
    
    # 单例实例
    _instance = None
    
    @classmethod
    def get_instance(cls, parent=None, duration=2000, toast_type=INFO):
        """
        获取 Toast 单例实例
        
        @param parent: 父组件
        @param duration: 显示时长（毫秒）
        @param toast_type: Toast 类型，可选值：info, success, warning, error
        @return: Toast 单例实例
        """
        # 确保duration是整数类型
        try:
            duration = int(duration)
        except (ValueError, TypeError):
            # 如果转换失败，使用默认值2000毫秒
            duration = 2000
            
        # 如果实例不存在或父组件发生变化，创建新实例
        if cls._instance is None or cls._instance.parent() != parent:
            cls._instance = cls(parent, duration, toast_type)
        else:
            # 更新现有实例的属性
            cls._instance.duration = duration
            cls._instance.toast_type = toast_type
            cls._instance._apply_style()
        
        return cls._instance
    
    def __init__(self, parent=None, duration=2000, toast_type=INFO):
        """
        初始化 Toast 组件
        
        @param parent: 父组件
        @param duration: 显示时长（毫秒）
        @param toast_type: Toast 类型，可选值：info, success, warning, error
        """
        super().__init__(parent)
        
        # 确保duration是整数类型
        try:
            self.duration = int(duration)
        except (ValueError, TypeError):
            # 如果转换失败，使用默认值2000毫秒
            self.duration = 2000
        
        # 保存 Toast 类型
        self.toast_type = toast_type
        
        # 设置样式
        self.setAlignment(Qt.AlignCenter)
        
        # 设置窗口属性
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool)
        self.setAttribute(Qt.WA_TransparentForMouseEvents)
        self.setAttribute(Qt.WA_TranslucentBackground, False)  # 禁用透明背景
        self.setAttribute(Qt.WA_ShowWithoutActivating)
        
        # 应用样式
        self._apply_style()
        
        # 设置定时器
        self.timer = QTimer(self)
        self.timer.setSingleShot(True)
        self.timer.timeout.connect(self.hide_animation)
        
        # 初始透明度
        self.opacity = 1.0
    
    def _apply_style(self):
        """
        应用样式
        """
        # 设置基本样式
        self.setAutoFillBackground(True)  # 启用背景填充
        
        # 创建调色板
        palette = self.palette()
        
        # 设置背景色 - 深灰色
        bg_color = QColor(50, 50, 50)
        palette.setColor(QPalette.Window, bg_color)
        
        # 设置文字颜色 - 白色
        text_color = QColor(255, 255, 255)
        palette.setColor(QPalette.WindowText, text_color)
        
        # 应用调色板
        self.setPalette(palette)
        
        # 设置边框颜色
        border_color = ""
        if self.toast_type == self.SUCCESS:
            border_color = "#2e7d32"
        elif self.toast_type == self.WARNING:
            border_color = "#ff8f00"
        elif self.toast_type == self.ERROR:
            border_color = "#d32f2f"
        else:  # INFO
            border_color = "#1976d2"
        
        # 应用样式表
        self.setStyleSheet(f"""
            QLabel {{
                border-radius: 10px;
                padding: 10px 20px;
                font-size: 14px;
                font-weight: bold;
                border-left: 4px solid {border_color};
                background-color: #323232;
                color: white;
            }}
        """)
        
        # 设置固定大小
        self.setMinimumWidth(250)
        self.setMinimumHeight(40)
    
    def show_message(self, message):
        """
        显示消息
        
        @param message: 消息内容
        """
        # 如果定时器正在运行，停止它
        if self.timer.isActive():
            self.timer.stop()
        
        # 设置文本
        self.setText(message)
        
        # 调整大小
        self.adjustSize()
        
        # 计算位置
        parent = self.parent()
        if parent:
            # 获取父组件的全局位置
            parent_pos = parent.mapToGlobal(QPoint(0, 0))
            parent_width = parent.width()
            parent_height = parent.height()
            
            # 计算 Toast 的位置（居中偏上）
            x = parent_pos.x() + parent_width // 2 - self.width() // 2
            y = parent_pos.y() + parent_height // 3 - self.height() // 2
            
            # 设置位置
            self.move(x, y)
        
        # 显示
        self.show()
        
        # 确保duration是整数类型
        try:
            duration = int(self.duration)
        except (ValueError, TypeError):
            # 如果转换失败，使用默认值2000毫秒
            duration = 2000
            
        # 启动定时器
        self.timer.start(duration)
    
    def hide_animation(self):
        """
        隐藏动画
        """
        # 直接隐藏，不使用动画
        self.hide()


def show_toast(parent, message, duration=2000, toast_type=Toast.INFO):
    """
    显示 Toast 消息
    
    @param parent: 父组件
    @param message: 消息内容
    @param duration: 显示时长（毫秒）
    @param toast_type: Toast 类型，可选值：Toast.INFO, Toast.SUCCESS, Toast.WARNING, Toast.ERROR
    """
    # 确保duration是整数类型
    try:
        duration = int(duration)
    except (ValueError, TypeError):
        # 如果转换失败，使用默认值2000毫秒
        duration = 2000
    
    # 查找主窗口
    main_window = parent
    while main_window and not main_window.isWindow():
        main_window = main_window.parent()
    
    # 如果找不到主窗口，使用传入的父组件
    if not main_window:
        main_window = parent
    
    # 获取 Toast 单例实例并显示
    toast = Toast.get_instance(main_window, duration, toast_type)
    toast.show_message(message)
    return toast 